package model

import (
	"time"

	"gorm.io/gorm"
)

type Member struct {
	// 基础字段
	ID        uint           `gorm:"primaryKey" json:"id"`
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`

	// 用户名
	Username string `gorm:"size:50;not null;uniqueIndex:idx_username" json:"username"`
	// 手机号
	Phone string `gorm:"size:20;not null;uniqueIndex:idx_phone" json:"phone"`
	// 邮箱
	Email string `gorm:"size:100;uniqueIndex:idx_email" json:"email"`
	// 密码
	Password string `gorm:"size:100;not null" json:"-"`
	// 昵称
	Nickname string `gorm:"size:50;default:''" json:"nickname"`
	// 头像
	Avatar string `gorm:"size:255;default:''" json:"avatar"`
	// 性别
	Gender uint8 `gorm:"type:tinyint;default:0" json:"gender"`
	// 生日
	Birthday *time.Time `gorm:"type:date" json:"birthday,omitempty"`
	// 状态
	Status uint8 `gorm:"type:tinyint;not null;default:1;index:idx_status" json:"status"`
	// 备注
	Remark string `gorm:"size:500;default:''" json:"remark,omitempty"`

	// 主用户ID（null表示自身是主用户）
	ParentID *uint `gorm:"index:idx_parent_member" json:"parent_id,omitempty"`
	// 是否为主用户（true-主用户，false-子用户）
	IsMaster bool `gorm:"default:true" json:"is_master"`
	// 关联主用户（反向查询）
	Master *Member `gorm:"foreignKey:ParentID" json:"master,omitempty"`
	// 关联子用户（主用户查询子用户）
	SubMembers []Member `gorm:"foreignKey:ParentID" json:"sub_members,omitempty"`
}

// TableName 方法用于定义数据库表的名称
// 这是一个 Member 结构体的指针方法，返回字符串类型的表名
func (*Member) TableName() string {
	return "members" // 返回数据库中实际的表名 "members"
}

// BeforeCreate 是 Member 结构体的方法，在记录创建前自动调用
// 它实现了 GORM 的钩子函数接口，用于在记录插入数据库之前执行一些逻辑
// 参数 tx 表示当前的 GORM 数据库事务对象
// 返回值 error，如果返回错误则创建操作将被中止
func (m *Member) BeforeCreate(tx *gorm.DB) error {
	// 检查昵称是否为空
	if m.Nickname == "" {
		// 如果昵称为空，则设置默认昵称为"用户"加上手机号后4位
		m.Nickname = "用户" + m.Phone[len(m.Phone)-4:] // 默认昵称：用户+手机号后4位
	}
	// 返回 nil 表示执行成功，创建操作可以继续进行
	return nil
}
